package com.and.video.service;


import com.and.video.dao.FileDao;
import com.and.video.domain.File;
import com.and.video.service.util.FastDFSUtil;
import com.and.video.service.util.MD5Util;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;


import java.util.Date;

@Service
public class FileService {

    @Autowired
    private FileDao fileDao;

    @Autowired
    private FastDFSUtil fastDFSUtil;

    public String uploadFileBySlices(MultipartFile slice,
                                     String fileMD5,
                                     Integer sliceNo,
                                     Integer totalSliceNo) throws Exception {

        // 根据文件的MD5值从数据库中查询是否已存在相同文件
        File dbFileMD5 = fileDao.getFileByMD5(fileMD5);

        // 如果数据库中存在相同MD5的文件，直接返回该文件的URL，避免重复上传
        if(dbFileMD5 != null){
            return dbFileMD5.getUrl();
        }

        // 如果不存在相同文件，调用FastDFS工具类进行分片上传
        String url = fastDFSUtil.uploadFileBySlices(slice, fileMD5, sliceNo, totalSliceNo);

        // 如果上传成功（URL不为空），将文件信息保存到数据库
        if(!StringUtil.isNullOrEmpty(url)){
            // 创建文件实体对象
            dbFileMD5 = new File();

            // 设置文件创建时间为当前时间
            dbFileMD5.setCreateTime(new Date());

            // 设置文件的MD5值
            dbFileMD5.setMd5(fileMD5);

            // 设置文件访问URL
            dbFileMD5.setUrl(url);

            // 设置文件类型（通过分析分片获取）
            dbFileMD5.setType(fastDFSUtil.getFileType(slice));

            // 将文件信息添加到数据库
            fileDao.addFile(dbFileMD5);
        }

        // 返回文件的访问URL（如果上传失败则返回null）
        return url;
    }
    /**
     * 获取文件的哈希值
     */
    public String getFileMD5(MultipartFile file) throws Exception {
        return MD5Util.getFileMD5(file);
    }

    public File getFileByMd5(String fileMd5) {
        return fileDao.getFileByMD5(fileMd5);
    }
}
